Estructuras dinámicas de datos
Consultas, lista de correo 'C++ Con Clase' 'C++ Con Clase' página de entrada Librerías estándar C Tabla de contenido Contactar con Webmaster
*Introducción
*1. Listas abiertas
*2. Pilas
 . 2.1 Definición
 . 2.2 Tipos de datos
 . 2.3 Operaciones básicas
 . 2.4 Push, insertar
 . 2.5 Pop, leer y eliminar
 . 2.6 Ejemplo en C
 . 2.7 Ejemplo en C++
 . 2.8 Ejemplo C++ plantillas
*3. Colas
*4. Listas circulares
*5. Listas doblemente enlazadas
*6. Árboles
*7. Árboles binarios de búsqueda (ABB)
*8. Árboles AVL
*Descarga de ejemplos
<< < > >>

2.8 Ejemplo de pila en C++ usando plantillas:  

Veremos ahora un ejemplo sencillo usando plantillas. Ya que la estructura para pilas es más sencilla que para listas abiertas, nuestro ejemplo también será más simple.

Seguimos necesitando dos clases, una para nodo y otra para pila. Pero ahora podremos usar esas clases para construir listas de cualquier tipo de datos.

Código del un ejemplo completo:

Veremos primero las declaraciones de las dos clases que necesitamos:

template<class TIPO> class pila;

template<class TIPO>
class nodo {
   public:
      nodo(TIPO v, nodo<TIPO> *sig = NULL) {
         valor = v;
         siguiente = sig;
      }

   private:
      TIPO valor;
      nodo<TIPO> *siguiente;

      friend class pila<TIPO>;
};

template<class TIPO>
class pila {
   public:
      pila() : ultimo(NULL) {}
      ~pila();

      void Push(TIPO v);
      TIPO Pop();

   private:
      nodo<TIPO> *ultimo;
};

La implementación de las funciones es la misma que para el ejemplo de la página anterior.

template<class TIPO>
pila<TIPO>::~pila() {
   while(ultimo) Pop();
}

template<class TIPO>
void pila<TIPO>::Push(TIPO v) {
   nodo<TIPO> *nuevo;

   /* Crear un nodo nuevo */
   nuevo = new nodo<TIPO>(v, ultimo);
   /* Ahora, el comienzo de nuestra pila es en nuevo nodo */
   ultimo = nuevo;
}

template<class TIPO>
TIPO pila<TIPO>::Pop() {
    nodo<TIPO> *Nodo; /* variable auxiliar para manipular nodo */
    TIPO v;      /* variable auxiliar para retorno */

    if(!ultimo) return 0; /* Si no hay nodos en la pila retornamos 0 */
    /* Nodo apunta al primer elemento de la pila */
    Nodo = ultimo;
    /* Asignamos a pila toda la pila menos el primer elemento */
    ultimo = Nodo->siguiente;
    /* Guardamos el valor de retorno */
    v = Nodo->valor;
    /* Borrar el nodo */
    delete Nodo;
    return v;
}

Eso es todo, ya sólo falta usar nuestras clases para un ejemplo práctico:

#include <iostream>
#include "CCadena.h"
using namespace std;
 
template<class TIPO> class pila;

template<class TIPO>
class nodo {
   public:
      nodo(TIPO v, nodo<TIPO> *sig = NULL) {
         valor = v;
         siguiente = sig;
      }

   private:
      TIPO valor;
      nodo<TIPO> *siguiente;

      friend class pila<TIPO>;
};

template<class TIPO>
class pila {
   public:
      pila() : ultimo(NULL) {}
      ~pila();

      void Push(TIPO v);
      TIPO Pop();

   private:
      nodo<TIPO> *ultimo;
};

template<class TIPO>
pila<TIPO>::~pila() {
   while(ultimo) Pop();
}

template<class TIPO>
void pila<TIPO>::Push(TIPO v) {
   nodo<TIPO> *nuevo;

   /* Crear un nodo nuevo */
   nuevo = new nodo<TIPO>(v, ultimo);
   /* Ahora, el comienzo de nuestra pila es en nuevo nodo */
   ultimo = nuevo;
}

template<class TIPO>
TIPO pila<TIPO>::Pop() {
    nodo<TIPO> *Nodo; /* variable auxiliar para manipular nodo */
    TIPO v;      /* variable auxiliar para retorno */

    if(!ultimo) return 0; /* Si no hay nodos en la pila retornamos 0 */
    /* Nodo apunta al primer elemento de la pila */
    Nodo = ultimo;
    /* Asignamos a pila toda la pila menos el primer elemento */
    ultimo = Nodo->siguiente;
    /* Guardamos el valor de retorno */
    v = Nodo->valor;
    /* Borrar el nodo */
    delete Nodo;
    return v;
}

int main() {
   pila<int> iPila;
   pila<float> fPila;
   pila<double> dPila;
   pila<char> cPila;
   pila<Cadena> sPila;

   // Prueba con <int>
   iPila.Push(20);
   iPila.Push(10);
   cout << iPila.Pop() << ",";
   iPila.Push(40);
   iPila.Push(30);

   cout << iPila.Pop() << ",";
   cout << iPila.Pop() << ",";
   iPila.Push(90);
   cout << iPila.Pop() << ",";
   cout << iPila.Pop() << endl;


   // Prueba con <float>
   fPila.Push(20.01);
   fPila.Push(10.02);
   cout << fPila.Pop() << ",";
   fPila.Push(40.03);
   fPila.Push(30.04);

   cout << fPila.Pop() << ",";
   cout << fPila.Pop() << ",";
   fPila.Push(90.05);
   cout << fPila.Pop() << ",";
   cout << fPila.Pop() << endl;

   // Prueba con <double>
   dPila.Push(0.0020);
   dPila.Push(0.0010);
   cout << dPila.Pop() << ",";
   dPila.Push(0.0040);
   dPila.Push(0.0030);

   cout << dPila.Pop() << ",";
   cout << dPila.Pop() << ",";
   dPila.Push(0.0090);
   cout << dPila.Pop() << ",";
   cout << dPila.Pop() << endl;

   // Prueba con <Cadena>
   cPila.Push('x');
   cPila.Push('y');
   cout << cPila.Pop() << ",";
   cPila.Push('a');
   cPila.Push('b');

   cout << cPila.Pop() << ",";
   cout << cPila.Pop() << ",";
   cPila.Push('m');
   cout << cPila.Pop() << ",";
   cout << cPila.Pop() << endl;

   // Prueba con <char *>
   sPila.Push("Hola");
   sPila.Push("somos");
   cout << sPila.Pop() << ",";
   sPila.Push("programadores");
   sPila.Push("buenos");

   cout << sPila.Pop() << ",";
   cout << sPila.Pop() << ",";
   sPila.Push("!!!!");
   cout << sPila.Pop() << ",";
   cout << sPila.Pop() << endl;

   cin.get();
   return 0;
}

Fichero con el código fuente: (por Steven R. Davidson) Descargar programa

<< < > >>